package com.heima.admin.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.admin.mapper.AdUserMapper;
import com.heima.admin.service.AduserService;
import com.heima.model.admin.dto.AdUserDto;
import com.heima.model.admin.pojo.AdUser;
import com.heima.model.admin.vo.AdUserVo;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.utils.common.AppJwtUtil;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by ZYJ on 2021/5/23 21:55
 */
@Service
public class AduserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AduserService {
    /**
     * 用户登录
     * @param adUserDto
     * @return
     */
    @Override
    public ResponseResult login(AdUserDto adUserDto) {
        //1. 参数校验
        if(StringUtils.isBlank(adUserDto.getName()) || StringUtils.isBlank(adUserDto.getPassword())){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //2. 基于用户名查询用户信息
        AdUser user = getOne(Wrappers.<AdUser>lambdaQuery().eq(AdUser::getName, adUserDto.getName()));
        //3. 如果用户不存在 返回错误
        if(user ==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
        }
        //4. 如果用户存在对比密码
        String password = user.getPassword(); //数据库中的密码
            //用户输入的密码和数据库中对应的盐进行拼接再进行MD5加密
        String loginPassword = DigestUtils.md5DigestAsHex(((adUserDto.getPassword() + user.getSalt()).getBytes()));
            //进行比对,如果比对错误返回错误信息
        if(!password.equalsIgnoreCase(loginPassword)){
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        if(user.getStatus() !=9){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"账号异常");
        }
        //5. 修改用户最近登录时间
        user.setLoginTime(new Date());
        this.updateById(user);
        //6. 生成token
        String token = AppJwtUtil.getToken(user.getId().longValue());
        //7. 返回结果 包含token和userVo 用map
        Map resultMap = new HashMap<>();
        AdUserVo userVo = new AdUserVo();
        BeanUtils.copyProperties(user,userVo);
        resultMap.put("token",token);
        resultMap.put("user",userVo);
        return ResponseResult.okResult(resultMap);
    }
    /**
     * 用户注册
     * @param user
     * @return
     */
    @Override
    public ResponseResult register(AdUser user) {
        //1.参数校验
        if(StringUtils.isEmpty(user.getName())||StringUtils.isEmpty(user.getPassword())){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"用户名或密码不能为空");
        }
          //生成盐
        /**  RandomStringUtils.randomAlphabetic
         * 产生一个长度为指定的随机字符串的字符数，字符将从拉丁字母（a-z、A-Z的选择）。
         * count:创建随机字符串的长度
         */
        String salt = RandomStringUtils.randomAlphabetic(8);
        String password = user.getPassword();
        user.setPassword(DigestUtils.md5DigestAsHex((password+salt).getBytes()));
        user.setSalt(salt);
        user.setCreatedTime(new Date());
        user.setStatus(9);
        this.save(user);
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }
}
